以下要進入 Coroutines 時光,雖然現在還是只知道淺淺的,目前也只紀錄我理解的部分,以下如有解釋不清或是描述錯誤的地方還請大家多多指教:
是一個由官方提供處理異步協程的 api,以結構化併發的方式執行,也就是說將我們的線程封裝起來,提供統一的入口與出口,在這個協程結束時能確保所有執行緒都被完成或取消,new 一個 coroutine 必須在一個完整的 CoroutineScope 裡,而 CoroutineScope 會需要透過以下幾個物件組成 CoroutineContext:
是一個可取消且有生命週期的背景執行工作,依附在 parent-child 的結構層,只要一取消所有子層行為都會跟著取消,以及在完成工作之後結束,也可透過 SupervisorJob 去客製化行為,以下有兩種較常見的 job interface:
Job()
factory 的 function 創建,必須呼叫 CompletableJob.complete
來表示完成Thread 的切換,來看看有幾種切換模式:
透過 withContext()
來切換不同的模式:
CoroutineScope(Dispatchers.IO).launch {
// do something in IO
withContext(Dispatchers.Main) {
// do something in Main
}
}
而 coroutine builders 又分成 launch 跟 async:
結束之後不會回傳結果,也不會 block 住 main thread,所以到 lunch 執行時,不會因為還沒執行完下面就卡住不做。
fun main() = runBlocking { // this: CoroutineScope
var first = "first word"
var second = "second word"
launch(Dispatchers.IO) { first = sayHello() }
launch(Dispatchers.IO) { second = sayWorld() }
println("$first")
println("$second")
}
suspend fun sayHello(): String {
delay(1000L)
return "Hello"
}
suspend fun sayWorld(): String {
delay(1000L)
return "World"
}
// get below
// first word
// second word
結束之後會回傳結果,透過 await() 來等待結果,async 就會等待 coroutine 執行結束後才往下。
fun main() = runBlocking { // this: CoroutineScope
var first = async(Dispatchers.IO) { sayHello() }
var second = async(Dispatchers.IO) { sayWorld() }
println("${first.await()}")
println("${second.await()}")
}
suspend fun sayHello(): String {
delay(1000L)
return "Hello"
}
suspend fun sayWorld(): String {
delay(1000L)
return "World"
}
// get below
// Hello
// World
今天不會有實作的範例,實作會跟下一篇一起:
因為他不是包含在 standard library,需要使用者新增 dependency :
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
Kotlin Coroutines in Android Summary
Official Kotlin
Android Kotlin